/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat.configuration;

/**
 * 表示配置文件中的一个模块。
 */
public final class ModuleConfig {
	private String identifier;
	private String dataServiceType;
	private String dataServiceUrl;
	private String dataSchema;
	private String status;
	private FunctionConfig[] functions;

	/**
	 * 使用模块的标识符、数据服务类型、数据服务路径和功能列表初始化 ModuleConfig 类的新实例。
	 * 
	 * @param identifier
	 *            标识符。
	 * @param dataServiceType
	 *            数据服务类型。
	 * @param dataServiceUrl
	 *            数据服务路径。
	 * @param dataSchema
	 *            数据架构名称。
	 * @param functions
	 *            隶属于模块的功能列表。
	 */
	public ModuleConfig(String identifier, String dataServiceType, String dataServiceUrl, String dataSchema, String status, FunctionConfig[] functions) {
		this.identifier = identifier == null ? "" : identifier;
		this.dataServiceType = dataServiceType == null ? "" : dataServiceType;
		this.dataServiceUrl = dataServiceUrl == null ? "" : dataServiceUrl;
		this.dataSchema = dataSchema == null ? "" : dataSchema;
		this.status = status == null ? "" : status;
		this.functions = functions;
	}

	/**
	 * 获取模块的标识符，不区分大小写。
	 *
	 * @return 模块的标识符，不区分大小写。
	 */
	public String getIdentifier() {
		return this.identifier;
	}

	/**
	 * 获取模块使用的数据服务。其值可以为预定义的 MySql、SqlServer，也可以是自定义的实现了 IDataService 接口的类型完整名称。
	 * 
	 * @return 模块数据服务的类型名称。
	 */
	public String getDataServiceType() {
		return this.dataServiceType;
	}

	/**
	 * 获取当前模块的 DataService 的路径。
	 * 
	 * @return 模块数据服务的类型名称。
	 */
	public String getDataServiceUrl() {
		return this.dataServiceUrl;
	}

	/**
	 * 获取当前模块模块使用的数据架构的名称，用于确定目标存储过程隶属的数据库架构。如果没有提供，则默认为 "{developerCode}_{appIdentifier}"。
	 * 
	 * @return 模块对应的数据架构的名称。
	 */
	public String getDataSchema() {
		return this.dataSchema;
	}

	/**
	 * 获取模块的当前状态。
	 * <p>
	 * 目前支持 "Normal"（或中文 "正常"）、"Maintenance"（或中文 "维护"），不区分大小写。如果不提供，则默认为 "正常"。
	 * <p>
	 * 如果隶属应用的状态为 "维护"，则应用中所有模块的状态都将为 "维护"。如果需要提供自定义的客户端反馈信息，使用 "维护:自定义信息" 或 "Maintenance:自定义信息" 的格式。
	 * <p>
	 * 处在 "维护" 状态中的模块暂时不可访问，但是仍然会出现在用户导航列表中，并向用户提示 "正在维护" 的消息。
	 * 
	 * @return 当前状态的字符串。
	 */
	public String getStatus() {
		return this.status;
	}

	/**
	 * 获取模块中所有功能的配置项目列表。
	 * 
	 * @return 隶属于模块的所有功能的配置项目的列表。
	 */
	public FunctionConfig[] getFunctions() {
		return this.functions;
	}

	/**
	 * 获取指定标识符的功能配置信息。
	 * 
	 * @param identifier
	 *            功能标识符，不区分大小写。
	 * @return 具有指定标识符的功能配置信息，如果没有找到，则返回 null。
	 */
	public FunctionConfig getFunctionConfig(String identifier) {
		for (FunctionConfig c : this.functions) {
			if (c.getIdentifier().equalsIgnoreCase(identifier)) {
				return c;
			}
		}

		return null;
	}
}
